package com.css.zfzx.fwsjcj.modules.statistics.user.service;

import com.css.zfzx.fwsjcj.modules.statistics.user.constant.DivisionConstant;
import com.css.zfzx.fwsjcj.modules.statistics.user.repository.UserQueryRepository;
import com.css.zfzx.fwsjcj.modules.statistics.user.vo.DivisionVo;
import com.css.zfzx.fwsjcj.modules.statistics.user.vo.UserNumVo;
import com.css.zfzx.fwsjcj.modules.statistics.user.vo.UserVo;
import com.css.zfzx.fwsjcj.modules.statistics.user.vo.DivisionUserVo;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;

/**
 * @Author leon
 * @Date: 2021/6/28 1:29 下午
 */
@Service
public class UserServiceImpl implements UserService {
    @Autowired
    UserQueryRepository userQueryRepository;

    @Override
    public List<UserVo> getUserList() {
        List<UserVo> allUser = userQueryRepository.getAllUser();
        HashMap<String, String> divisionMap = userQueryRepository.getAllDivisionName();
        /**
         * 以下操作是给用户的地区关联省市区名称
         */
        allUser.forEach(userVo -> {
            // 地区等级
            String level = String.valueOf(userVo.getDivisionLevel());
            // 行政区划地区的所有上级的地区id，逗号分开
            String allParentId = userVo.getAllParentId();
            String[] ids = allParentId.split(",");
            // 上级的地区id并且最后包含自己，如果是省的话，size肯定是2
            int size = ids.length;
            if (DivisionConstant.DIVISION_LEVEL_1.equals(level) && size == 2) {
                // 当前用户的地区
                String province = userVo.getDivisionName();
                if (StringUtils.isNotEmpty(province)) {
                    userVo.setProvince(province);
                } else {
                    // 根据id获取地区名称
                    String divisionName = divisionMap.get(ids[1]);
                    if (StringUtils.isNotBlank(divisionName)) {
                        userVo.setProvince(divisionName);
                    }
                }
            }
            if (DivisionConstant.DIVISION_LEVEL_2.equals(level) && size == 3) {
                String provinceName = divisionMap.get(ids[1]);
                userVo.setProvince(provinceName);
                // 当前用户是市级用户，city就是地址的值
                String city = userVo.getDivisionName();
                userVo.setCity(city);
            }
            if (DivisionConstant.DIVISION_LEVEL_3.equals(level) && size == 4) {
                String provinceName = divisionMap.get(ids[1]);
                String cityName = divisionMap.get(ids[2]);
                userVo.setProvince(provinceName);
                userVo.setCity(cityName);
                // 当前用户是县级用户，area就是地址的值
                String area = userVo.getDivisionName();
                userVo.setArea(area);
            }
            if (Integer.valueOf(level) > 3) {
                String provinceName = divisionMap.get(ids[1]);
                String cityName = divisionMap.get(ids[2]);
                String areaName = divisionMap.get(ids[3]);
                userVo.setProvince(provinceName);
                userVo.setCity(cityName);
                userVo.setArea(areaName);
            }
        });
        // 排序
        Collections.sort(allUser);
        return allUser;
    }

    @Override
    public List<UserNumVo> getUserNumList() {
        // 获取地区id和数量
        List<UserNumVo> allUserNum = userQueryRepository.getAllUserNum();
        HashMap<String, DivisionVo> divisionMap = userQueryRepository.getAllDivision();
        allUserNum.forEach(userNumVo -> {
            // 地区id
            String divisionId = userNumVo.getDivisionId();
            if (StringUtils.isNotBlank(divisionId)) {
                // 根据地区id获取该地区的所有信息
                DivisionVo division = divisionMap.get(divisionId);
                if (division != null) {
                    // 所有父地区id
                    String allParentId = division.getAllParentId();
                    String parentId = division.getParentId();
                    if (StringUtils.isNotBlank(allParentId)) {
                        String[] ids = allParentId.split(",");
                        int size = ids.length;
                        if (size == Integer.valueOf(DivisionConstant.PARENTID_SIZE_2)
                                || DivisionConstant.DIVISION_ID_ROOT.equals(parentId)
                                || size <= Integer.valueOf(DivisionConstant.PARENTID_SIZE_1)) {
                            // 若是2的话或者父id为root的话，则是省;
                            userNumVo.setProvince(division.getDivisionName());
                        }
                        if (size == Integer.valueOf(DivisionConstant.PARENTID_SIZE_3)) {
                            // 大小为3，则是市
                            DivisionVo province = divisionMap.get(ids[1]);
                            userNumVo.setProvince(province.getDivisionName());
                            userNumVo.setCity(division.getDivisionName());
                        }
                        if (size > Integer.valueOf(DivisionConstant.PARENTID_SIZE_3)) {
                            // 大小大于3时，都当成县处理
                            DivisionVo province = divisionMap.get(ids[1]);
                            DivisionVo city = divisionMap.get(ids[2]);
                            userNumVo.setProvince(province.getDivisionName());
                            userNumVo.setCity(city.getDivisionName());
                            userNumVo.setArea(division.getDivisionName());
                        }
                    }
                }
            } else {
                userNumVo.setProvince("没有关联行政区划");
            }
        });
        // 排序
        Collections.sort(allUserNum);
        return allUserNum;
    }

    @Override
    public List<DivisionUserVo> getProvinceUser() {
        //获取一级省信息
        List<DivisionVo> divisionList = userQueryRepository.getAllProvinceName();
        List<DivisionUserVo> dus = new ArrayList<>();
        //构建sql
        if(divisionList!=null && divisionList.size()>0){
            for(DivisionVo vo:divisionList){
                //'"+vo.getDivisionName()+"' divisionName,
                BigInteger count = userQueryRepository.buildProvinceUserData(vo.getDivisionId());
                DivisionUserVo divisionUserVo = new DivisionUserVo();
                divisionUserVo.setDivisionName(vo.getDivisionName());
                divisionUserVo.setCount(count);
                dus.add(divisionUserVo);
            }
        }
        return dus;
    }
}
